#ifndef VAISSEAU_INCLUDED
#define VAISSEAU_INCLUDED

#include "point.h"
#include "evalequa.h"
#include <chrono>

class Vaisseau
{
protected:
    //Moteur physique
    point position;
	point vecvitesse;
	double anglevert;
	double anglehor;
	double anglerotation;

    //Gameplay
	typedef std::chrono::time_point<std::chrono::system_clock> Temps;
    Temps timertir;
	Temps timerdeplacement;
	const Vaisseau* cibleauto;
	float cadencetir;
	int etat;
	int vie;
	int viemax;

public:
	//constructeurs
	Vaisseau();

	//operateurs
	Vaisseau& operator*=(const Vaisseau& V);

	//Fonctions
	virtual void deplacement() = 0;

	//Set
	Vaisseau& Setanglevert(double n);
	Vaisseau& Setanglehor(double n);
	Vaisseau& Setanglerotation(double n);
    Vaisseau& Settimertir();
	Vaisseau& Setcadencetir(float n);
	Vaisseau& Setetat(int n);
	virtual Vaisseau& Setvie(int n);
	Vaisseau& Setviemax(int n);

	//Get
	point& Getposition();
	point& Getvecvitesse();
	double Getanglevert() const;
	double Getanglehor() const;
	double Getanglerotation() const;
	Temps& Gettimertir();
	const Vaisseau* Getcibleauto() const;
	float Getcadencetir() const;
	int Getetat() const;
	int Getvie() const;
	int Getviemax() const;
};

class VaisseauEnnemiauto : public Vaisseau
{
private:
	EvalEqua trajectoire;
public:
	void deplacement();
};

class VaisseauEnnemi : public Vaisseau
{
public:
	void deplacement();
};

class VaisseauJoueur : public Vaisseau
{
private:
	double angledirection;
	char intensitedirection;
	char acceleration;
public:
	//Constructeurs
	VaisseauJoueur();

	//fonctions
	void deplacement();
	point tirer() const;

	//Sets
	VaisseauJoueur& Setvie(int n);
	VaisseauJoueur& SetControles(double angle, char intenangle, char acceleration);

	//Gets
	double Getangledirection() const;
	char Getintensitedirection() const;
	char Getacceleration() const;
};

/* Fonctions inline */
inline point& Vaisseau::Getposition() { return position; }
inline point& Vaisseau::Getvecvitesse() { return vecvitesse; }
inline double Vaisseau::Getanglevert() const { return anglevert; }
inline double Vaisseau::Getanglehor() const { return anglehor; }
inline double Vaisseau::Getanglerotation() const { return anglerotation; }
inline Vaisseau::Temps& Vaisseau::Gettimertir() { return timertir; }
inline const Vaisseau* Vaisseau::Getcibleauto() const { return cibleauto; }
inline float Vaisseau::Getcadencetir() const { return cadencetir; }
inline int Vaisseau::Getetat() const { return etat; }
inline int Vaisseau::Getvie() const { return vie; }
inline int Vaisseau::Getviemax() const { return viemax; }

inline double VaisseauJoueur::Getangledirection() const { return angledirection; }
inline char VaisseauJoueur::Getintensitedirection() const { return intensitedirection; }
inline char VaisseauJoueur::Getacceleration() const { return acceleration; }


#endif